import os                 

#获取正常邮件和垃圾邮件的文件列表
normal_file_list= os.listdir("C:\\Users\\43023\\Desktop\\room\\ml-lesson\\03_dataset\\item5\\item5-ss-data\\normal")
spam_file_list= os.listdir("C:\\Users\\43023\\Desktop\\room\\ml-lesson\\03_dataset\\item5\\item5-ss-data\\spam")
print(f"正常邮件的文件列表:{normal_file_list}")
print(f"垃圾邮件的文件列表:{spam_file_list}")

#加载停用词文件，用于对停用词进行过滤
stopList=[]
for line in open("C:\\Users\\43023\\Desktop\\room\\ml-lesson\\03_dataset\\item5\\item5-ss-data\stopwords.txt",
encoding='utf-8'):
     stopList.append(line[:len(line)-1])
print("停用词文件内容：",stopList)

#第二步
from jieba import cut	#导入中文分词库
from re import sub
#定义getWords()函数，用于提取指定文件（邮件文件）中的词语
def getWords(file,stopList):
    wordsList=[]
    for line in open(file,encoding='utf-8'):
         line=line.strip()
        #过滤干扰字符或无效字符
         line=sub(r'[.【】0-9、——,。!\~*]','',line)  
         line=cut(line)
         #过滤长度为1的单个字
         line=filter(lambda word:len(word)>1,line) 
         wordsList.extend(line)
        #过滤停用词，剩余有效词语
         words=[]
         for i in wordsList:
            if i not in stopList and i.strip()!='' and i!=None:
               words.append(i)
    return words

#第三步数据预处理
from collections import Counter
from itertools import chain
#提取训练集所有文件中的词语
allwords=[]
for spamfile in spam_file_list:
    words=getWords("C:\\Users\\43023\\Desktop\\room\\ml-lesson\\03_dataset\\item5\\item5-ss-data\\spam/"+spamfile,stopList)
    allwords.append(words)
for normalfile in normal_file_list:
    words=getWords("C:\\Users\\43023\\Desktop\\room\ml-lesson\\03_dataset\\item5\\item5-ss-data\\normal/"+normalfile,stopList)
    allwords.append(words)

print(f"训练集中所有的有效词：{allwords}")

#提取训练集中出现频次最高的前10个词语
frep=Counter(chain(*allwords))	                  #获取有效词语出现的频次
topTen=frep.most_common(10)		#获取出现频次最高的前10个词语和对应的频次
topWords=[w[0] for w in topTen]	#获取出现频次最高的前10个词语
print("训练集中出现频次最高的前10个词语:")
print(topWords)

import numpy as np
vector=[]
for words in allwords:
    temp=list(map(lambda x:words.count(x),topWords))			                   #每个高频词语在每封邮件中出现的次数
    vector.append(temp)
vector=np.array(vector)
print(f"10个高频词语在每封邮件中出现的次数：{vector}")

#训练分类器
from sklearn.naive_bayes import MultinomialNB
#为数据集打标签，1表示垃圾邮件，0表示正常邮件
target=np.array([1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0])
x,y=vector,target
#建立多项式朴素贝叶斯模型并进行训练
model=MultinomialNB()
model.fit(x,y)

#第五步测试邮件
#获取测试邮件文件列表
test=os.listdir("C\\Users\\43023\\Desktop\\room\\ml-lesson\\03_dataset\\item5\\item5-ss-data\\test")
#使用模型进行预测
for testFile in test:
    words=getWords("C:\\Users\\43023\\Desktop\\room\\ml-lesson\\03_dataset\\item5\\item5-ss-data\\test"+testFile,stopList)	#调用get_word函数，提取有效词			     #调用getWords()函数，提取文件中的词语
    test_x=np.array(tuple(map(lambda x:words.count(x),topWords)))					     #提取10个高频词语分别在邮件中出现的次数
    result=model.predict(test_x.reshape(1,-1))
    if result==1:
          print('"'+testFile+'"'+"是垃圾邮件")
    else:
          print('"'+testFile+'"'+"是正常邮件")